/**
 * 用户管理控制器模块
 * 
 * 处理用户增删改查(CRUD)操作的业务逻辑
 */

const { User } = require('../models/user.model');
const UserService = require('../services/users.service');
const CustomError = require('../utils/CustomError');
const logger = require('../utils/logger');

//TODO:实现用户控制器方法
//方法名的命名规则：动词+操作对象，规范是驼峰命名法
async function getAllUsers(req, res) {
  logger.debug("获取用户列表");
  //从服务层获取用户列表
  const users = await UserService.getAllUsers();

  //返回结果
  res.json({
    code: 200,
    message: "获取用户列表成功",
    data: users.map((user) => user.toJSON())
  });
}

async function getUserById (req, res) {
  //从请求参数中获取用户id
  const id = req.params.id;

  logger.debug(`获取用户 ID: ${id}`);
  //调用用户服务层，获取用户信息
  const user = await UserService.getUserById(id);

  //业务上可预期的错误，我们需要优雅地处理
  //如果用户不存在，返回 404 错误信息
  if (!user) {
    throw new CustomError(404, '用户不存在');
  }
     
  res.json(
    { 
      code: 200,
      message: "获取用户信息成功",
      data: user.toJSON() 
    }
  );
}

async function createUser (req, res) {
  logger.debug("创建用户");
  logger.debug("请求体", req.body);
  //从请求参数中获取用户信息
  //这些参数由接口文档规定，一般由后端开发人员和前端开发人员协商确定
  let { nickName,avatarUrl,openid,active, gender, city, province, country } = req.body;
  logger.debug(`nickName: ${nickName}`);

  //校验参数
  if (!nickName || nickName.trim() === "" || nickName.length > 50) {
    throw new CustomError(400, '用户昵称不能为空，且不能超过50个字符');
  }
  
  //校验性别参数
  if (gender !== undefined && !(gender === '0' || gender === '1' || gender === '2')) {
    throw new CustomError(400, '性别参数错误，应为0-男，1-女，2-其他');
  }
  //对数据进行清洗或处理
  if (active === undefined || !(active === 0 || active === 1)) {
    active = 0;
  }

  if (openid) {
    //根据openid查询用户
    const existingUser = await UserService.getUserByOpenid(openid);
    if (existingUser) {
      throw new CustomError(400, '用户的openid已存在');
    }
  }

  //调用用户服务层，创建用户
  const user = await UserService.createUser({
    nickName,   
    avatarUrl,
    openid,
    active,
    gender,
    city,
    province,
    country
  });

  
  //状态201表示资源创建成功，返回创建的用户信息
  res.status(200).json(
    { 
      code: 201,
      message: "用户创建成功",
      data: user.toJSON() 
    }
  )
}

async function updateUser (req, res)  {
  logger.debug("更新用户");
  logger.debug("请求体", req.body);
  //从请求参数中获取用户信息
  const { id } = req.params;

  //这些参数由接口文档规定，一般由后端开发人员和前端开发人员协商确定
  const { nickName,avatarUrl,openid,active, gender, city, province, country } = req.body;
  
  //校验性别参数
  if (gender !== undefined && !(gender === '0' || gender === '1' || gender === '2')) {
    throw new CustomError(400, '性别参数错误，应为0-男，1-女，2-其他');
  }
  //从服务层获取用户信息
  let user = await UserService.getUserById(id);
  if (!user) {
    throw new CustomError(404, '用户不存在');
  }
  
  //校验参数:nickName是否允许空字符串
  if (nickName === null 
      || (nickName !== undefined 
          && (nickName.trim() === "" || nickName.length > 50))) {
    throw new CustomError(400, '用户昵称不能为空，且不能超过50个字符');
  }

  //对用户状态进行校验
  if (active !== undefined && !(active === 0 || active === 1)) {
     throw new CustomError(400, '用户状态错误');
  }

  //对openid进行校验，确保唯一性
  if (openid !== undefined && openid !== null && openid !== user.openid) {
    //根据openid查询用户
    const existingUser = await UserService.getUserByOpenid(openid);
    if (existingUser) {
      throw new CustomError(400, '用户openid已存在');
    }
  }

  //更新用户信息
  user.nickName = nickName || user.nickName;
  user.avatarUrl = avatarUrl === undefined ? user.avatarUrl : avatarUrl;
  user.openid = openid === undefined ? user.openid : openid;
  user.active = active === undefined ? user.active : active;
  user.gender = gender === undefined ? user.gender : gender;
  user.city = city === undefined ? user.city : city;
  user.province = province === undefined ? user.province : province;
  user.country = country === undefined ? user.country : country;

  //调用用户服务层，更新用户信息
  user = await UserService.updateUser(user);

  logger.debug("更新后的用户信息:");
  logger.debug(user);
  
  //返回更新后的用户信息
  res.json(
    { 
      code: 200,
      message: "用户更新成功",
      data: user.toJSON() 
    }
  );
}

async function deleteUser(req, res){
  logger.debug("删除用户");
  logger.debug("请求参数", req.params);
  //从请求参数中获取用户id
  const { id } = req.params;

  //从服务层获取用户信息
  const user = await UserService.getUserById(id);

  if (!user) {
    throw new CustomError(404, '用户不存在');
  }
  //TODO:业务逻辑：删除用户前，需要检查该用户是否有关联的数据，视具体业务而定

  //调用用户服务层， 删除用户
  await UserService.deleteUserById(id);
  //返回结果
  res.json({
    code: 200,
    message: "用户删除成功"
  });
}

module.exports = {
  //导出用户控制器方法
  getAllUsers,
  getUserById,
  createUser,
  updateUser,
  deleteUser
}